Introducción

En la actualidad, debido a la globalización es importante para las empresas conocer a sus clientes, la tecnología, sin duda ha permitido recaudar volúmenes enormes de información, sin embargo, en muchas ocasiones precisamente la información requerida por una empresa es difícil de obtener o representa información sensible para los usuarios, ya que invade su privacidad. No obstante, con los avances en analítica se han creado herramientas para lograr obtener la información necesaria de los usuarios sin invadir su intimidad y está ha podido utilizarse para estimar valores sobre el resto de la población aun sin tener que preguntar directamente sobre la misma.

Entre los datos que en algunos contextos pueden ser censurados u omitidos está el número de hijos en un hogar, lo que hace que sea una variable de la que no se dispone directamente; por lo tanto el problema en particular en el que se está interesado es la predicción del número de hijos en base a las características de los hogares colombianos.

Se decidió abordar este problema como un problema de clasificación (aprendizaje supervisado). Para esto se tuvo en cuenta los siguiente:

Se realizó una buena investigación y contextualización del conjunto de datos que fueron obtenidos de la ECV realizada por el DANE en 2019, mediante este se tuvo la oportunidad de establecer el número de hijos mediante la combinación de algunas variables presentes en un conjunto de datos particular abordado en la encuesta, además de seleccionar las variables más relevantes para realizar un análisis y la modelación.

Se procedió a la selección de variables las cuales posteriormente fueron unidas mediante indicadores de hogares, este procedimiento fue realizado de manera muy cuidadosa para no obtener información incorrecta, después de este paso se llegó a una base de datos con las variables consideradas por lo investigadores como de interés.

Previo a lo anterior, se procedió a realizar análisis descriptivos sobre el conjunto de datos, que ayudaran a una mejor comprensión de las variables y a seleccionar cuales de estas eran más relevantes para predecir el número de hijos, se realizaron gráficos y demás análisis.

Como paso siguiente se usaron técnicas estadísticas para la selección de variables mediante la formulación de modelos, los cuales en su mayoría coincidieron con los resultados las variables seleccionadas mediante el análisis descriptivo.

Luego de este proceso de selección de variables se obtuvo un conjunto de datos con menos variables pero con el mismo número de registros, para así con este empezar la modelación.

Para la modelación se tomó en cuenta como un problema de clasificación donde el número de hijos corresponde a cada nivel de la variable respuesta como categoría.

Los modelos seleccionados fueron considerados como los más adecuados para este problema en particular y son populares en el mundo del aprendizaje estadístico, se realizaron ajustes con cada uno y se realizó validación cruzada para poder evaluar el rendimiento de cada uno de ellos (mediante tasas de acierto y error).

Después de ajustar varios modelos, se analizó la posibilidad de encontrar el mismo resultado con menos variables, encontrando que se obtenía la misma tasa de acierto aunque el número de variables utilizadas era menor; por lo tanto, se decidió nuevamente hacer una reducción de variables, de tal manera que se obtuvieron modelos más parsimoniosos (Buenos resultados con menos variables) llegando finalmente a modelos con 5 variables.

De los modelos ajustados inicialmente se consideraron los cuatro mejores. Posteriormente estos modelos se ponen en competencia mediante distintas muestras aleatorias divididas en conjunto de entrenamiento y validación de tal manera que el mejor modelo sea aquel que obtenga mejores resultados en el conjunto de validación en las diferentes muestras.

Bosques Aleatorios resultó ser el mejor después de este procedimiento teniendo una alta tasa de aciertos. Después se ajustó el mismo modelo con el conjunto de datos completo, con el fin de generar mejores predicciones por el hecho de contar con un mayor número de información.

Como parte final, se aplicará el modelo obtenido en una página web que permitirá la interacción con sus posibles usuarios, esto mostrará su potencial para predecir el número de hijos de un hogar según la estructura del mismo.

Retos

Contextualización del conjunto de datos:

El número de hijos en un hogar es una variable muy simple y poco estudiada en algunos contextos, por eso los volúmenes de datos que se encuentran en la web muchas veces no disponen de este tipo de información, pero para entidades como inmobiliarias, empresa crediticias, etc; puede serles de sumo interés, por ello bajo trabajos de investigación se llega a la conclusión de que estas variables pueden ser deducidas a partir de otras que siguen en el mismo contexto, en este caso particular el número de hijos puede ser deducida a partir de conjuntos de datos relacionados con información acerca de los hogares del país, en cómo es su estructura, a partir de información puntual de cada uno de los integrantes, sin previamente haber recibido información de cuántos de esos integrantes son hijos, por tanto una de las bases de datos que se considera tienen más relación con las viviendas y hogares de Colombia es la encuesta de Calidad de vida, donde la más actualizada hasta la fecha es la realizada en el año 2019.

La Encuesta de Calidad de Vida (ECV) es una investigación que realiza el DANE, con el objetivo de recoger información sobre diferentes aspectos y dimensiones del bienestar de los hogares, incluyendo aspectos como el acceso a bienes y servicios públicos, privados o comunales, salud, educación, cuidado de niños y niñas menores de 5 años, entre otros. Esta información posibilita efectuar análisis posteriores de los factores que explican los diferentes niveles de vida existentes en la población colombiana.

Por ello mediante este conjunto de datos que tiene un gran volumen se intenta extraer aquellas variables que se consideran más representativas para intentar predecir el número de hijos que tienen cada uno de los hogares; Antes de ello se debe de definir para este investigación que es un hogar y que es el número de hijos, para realizar todos los análisis posteriores en función de esta variable (Número de hijos en el hogar).

Definiciones importantes

Usuario

Inmobiliarias, empresas crediticias, en las cuales el número de hijos es una información sensible ya que este puede suponerse como un impedimento ya sea a la hora de conseguir o rentar apartamento o para conseguir préstamos ya que se concibe que el mantenimiento de los hijos es elevado y este sube cuantos más hijos posee el prestatario por lo que resulta más complicado para los padres de familia acceder a los mismos.

Agencias o constructoras inmobiliarias en ocasiones tienen mucha información histórica de los clientes, sobretodo de los jefes de hogar, obteniendo así información relevante de las características de un hogar. En base a estas características podemos predecir el número de hijos del mismo, lo cual pueden utilizar dichas empresas para lanzar nuevos proyectos y ofrecer atención más personalizada a los hogares. Adicionalmente, algunas empresas que facilitan el arriendo como intermediarios pueden tener políticas de arriendo como el hecho de que no se admiten hijos en los hogares, esto es común en residencias estudiantiles, entre otros.

Hogar

Según el DANE se entiende como hogar a una persona o grupo de personas que ocupan la totalidad o parte de una vivienda y que se han asocian para compartir su lugar de descanso, alimentos y demás necesidades básicas (si se trata de hogar-unidad doméstica) . Pueden ser familiares o no entre sí.

Un hogar no puede dividirse en más de una vivienda, pero dentro de cada vivienda, puede haber más de un hogar, conformado por una o más personas con o sin vínculos de parentesco.

Número de hijos

Se define el número de hijos de acuerdo con los hogares colombianos promedio definidos por el DANE, en los cuales se tienen:

  • Parejas con hijos.
  • Una persona sola.
  • Padre o madre y sus hijos.
  • Parejas sin hijos.
  • Hogar extenso-compuesto, definido como hogares nucleares (alguna de las opciones anteriormente mencionadas) más otros parientes.

Se muestra a continuación una imagen que ejemplifica mejor lo antes mencionado:

En base a esto se considera como el número de hijos, a los hijos, hijastros y nietos del jefe del hogar sin discriminar por edad, ya que esta es la forma que en general funciona mejor en base a la mayoría de estructuras de los hogares en Colombia.

En casos generales funciona esta estructura ya que en la mayoría de hogares cuenta con padres y si estos no están presentes, los abuelos de los hijos lo están, ya que en casos donde se considera que si hay varios grupos familiares en una misma vivienda, como lo son por ejemplo varios hermanos con sus respectivos hijos, estos se dividirán en diferentes hogares ya que son varios núcleos familiares en una misma vivienda los cuales deben ser tomados como hogares de manera independiente, por lo tanto estructuras como estas no sesgan la elección de la variable del número de hijos, además que cabe aclarar que la encuesta de calidad de vida hace esta misma división, ya que en una misma vivienda se ven presentes varios hogares(siendo 5 el máximo), por lo tanto esta variable fue seleccionada como el criterio más correcto en base a la estructura de la encuesta de calidad de vida y en la perspectiva de los investigadores.

Materiales

Contextualización de las variables utilizadas

Características y composición del hogar.

Compuesta por 46 variables de las cuales se escogieron

Código Nombre Pregunta
P6040 Genero Sexo: 1 Hombre 2 Mujer
P6040 Edad ¿Cuántos años cumplidos tiene … ?
P6051 - ¿Cuál es el parentesco de ___ con el jefe o la jefa de este hogar? 1 Jefe (a) del hogar 2 Pareja, esposo (a), cónyuge, compañero(a) 3 Hijo(a) hijastro(a) 4 Nieto (a) 5 Padre, madre, padrastro y madrastra 6 Suegro o suegra 7 Hermano (a), hermanastro (a) 8 Yerno, nuera 9 Otro pariente del jefe(a) 10 Empleado(a) del servicio doméstico 11 Parientes del servicio doméstico 12 Trabajador 13 Pensionista 14 Otro pariente
P5502 Estado_civil Actualmente el jefe del hogar: 1 No está casado(a) y vive en pareja hace menos de dos años 2 No está casado(a) y vive en pareja hace dos años o más 3 Está viudo(a) 4 Está separado(a) o divorciado(a) 5 Está soltero(a) 6 Está casado(a)
P756 Lugar_nacimiento ¿Dónde nació el jefe del hogar? 1 En este municipio 2 En otro municipio 3 En otro país
P6081 Vive_hogar_padre ¿El padre del jefe del hogar vive en este hogar?
P6087 Educacion_padre ¿Cuál es o fue el nivel de educación más alto alcanzado por el padre del jefe del hogar?
P6083 Vive_hogar_madre ¿La madre del jefe del hogar vive en este hogar?
P6088 Educacion_madre ¿Cuál es o fue el nivel de educación más alto alcanzado por la madre del jefe del hogar?
P6080 Etnia De acuerdo con su cultura, pueblo o rasgos físicos, _____ es o se reconoce como: 1 Indígena 2 Gitano (a) (Rom) 3 Raizal del archipiélago de San Andrés, Providencia y Santa Catalina 4 Palenquero (a) de San Basilio 5 Negro (a), mulato (a) (afrodescendiente), afrocolombiano(a) 6 Ninguno de los anteriores

Condiciones de vida del hogar y tenencia de bienes (programas).

Compuesta por 8 variables de las cuales se escogió:

Código Nombre Pregunta
P784S4A3 Num_subsidios ¿Cuántos miembros del hogar reciben subsidios?

Datos de la vivienda.

Compuesta por 35 variables de las cuales se escogieron:

Código Nombre Pregunta
P1070 Tipo_vivienda Tipo de vivienda: 1 Casa 2 Apartamento 3 Cuarto(s) 4 Vivienda tradicional indigena 5 Otro (carpa, contenedor, vagón, embarcación, cueva, refugio natural, etc
P4015 Material_pisos Material predominante de los pisos: 1 Alfombra o tapete de pared a pared 2 Madera pulida y lacada, parqué 3 Mármol 4 Baldosa, vinilo, tableta, ladrillo, laminado 5 Madera burda, tabla, tablón, otro vegetal 6 Cemento, gravilla 7 Tierra, arena
P8520S1 Energia_electrica ¿La vivienda cuenta con energía eléctrica? 1 Sí 2 No
P8520S1A1 Estrato Estrato para tarifa de la energía eléctrica: 1 Bajo - Bajo 2 Bajo 3 Medio - Bajo 4 Medio 5 Medio - Alto 6 Alto 8 Planta eléctrica 9 No conoce el estrato o no cuenta con recibo de pago. 0 Recibos sin estrato o el servicio es pirata
P8520S5 Acueducto ¿La vivienda cuenta con acueducto? 1 Sí 2 No
P8520S3 Alcantarillado ¿La vivienda cuenta con alcantarillado? 1 Sí 2 No
P8520S4 Basuras_semana ¿Cuenta con servicio de Recolección de basuras? 1 Sí 2 No

Educación.

Compuesta por 58 variables de las cuales se escogieron:

Código Nombre Pregunta
P8586 Estudia ¿El jefe del hogar actualmente estudia? (asiste al preescolar, escuela, colegio o universidad) 1 Sí 2 No
P8587 Nivel_educativo ¿Cuál es el nivel educativo más alto alcanzado por el jefe del hogar y el último año o grado aprobado en este nivel? 1 Ninguno 2 Preescolar 3 Básica Primaria (1º - 5º) 4 Básica secundaria (6º–9º) 5 Media (10º–13º) 6 Técnico sin título 7 Técnico con título 8 Tecnológico sin título 9 Tecnológico con título 10 Universitario sin titulo 11 Universitario con titulo 12 Postgrado sin titulo 13 Postgrado con titulo

Salud.

Compuesta por 103 variables de las cuales se escogieron:

Código Nombre Pregunta
P6090 Afiliado ¿El jefe del hogar está afiliado (a), es cotizante o es beneficiario (a) de alguna entidad de seguridad social en salud? (Entidad promotora de salud [EPS] o entidad promotora de salud subsidiada EPS-S) 1 Sí 2 No 9 No sabe, no informa
P6127 Salud_general El estado de salud del jefe del hogar en general, es: 1 Muy bueno 2 Bueno 3 Regular 4 Malo

Servicios del hogar.

Compuesta por 64 variables de las cuales se escogieron:

Código Nombre Pregunta
P5666 Gas_natural ¿En este hogar tienen servicio de Gas Natural conectado a red pública? 1 Sí 2 No
P5305 Telefonia_fija ¿En este hogar tienen servicio telefónico fijo? 1 Sí 2 No
I_HOGAR Ingresos_hogar Ingreso Mensual Total del Hogar

Tenencia y financiación de la vivienda que ocupa el hogar.

Compuesta por 20 variables de las cuales se escogieron:

Código Nombre Pregunta
P5095 Contrato_vivienda ¿La vivienda ocupada por este hogar es? 1. Propia, totalmente pagada 2. Propia, la están pagando 3. En arriendo o subarriendo 4. Con permiso del propietario, sin pago alguno (usufructuario) 5. Posesión sin título (ocupante de hecho) 6. Propiedad colectiva

Uso de energéticos del hogar.

Compuesta por 45 variables de las cuales se escogieron:

Código Nombre Pregunta
P5018 Ultimo_pago_energia ¿Cuánto pagaron EL MES PASADO o la última vez por la electricidad consumida?
P5018S1 - ¿A cuántos meses corresponde el pago de la última vez por la electricidad consumida?

Variables construidas a partir de otras.

Código Nombre Variables utilizadas
P5018S Pago_mes_energia Esta variable fue creada dividiendo P5018/P5018S1 con el fin de obtener el pago mensual de electricidad
Num_integrantes Num_integrantes Esta variable fue creada sumando 1 unidad cada vez que el número de ORDEN cambiaba
Num_hijos Num_hijos Esta variable fue creada sumando 1 cada vez que la pregunta código P6051 toma el valor de 3 o 4 correspondiente a hijo o nieto

Metodología

Preprocesamiento de los datos

Creación de la variable número de hijos

Debido a que la variable de interés (Número de hijos) no aparece de manera explícita, se llevó a cabo un proceso de construcción de la misma. Esto fue posible gracias a algunas de las variables de la base de datos Características y composición del hogar, presente en la encuesta antes mencionada que permiten conocer la relación de cada individuo con el jefe del hogar.

Como primer paso se realiza la lectura de las bases de datos:

Caracteristicas_hogar_personas <- read.table("Caracteristicas y composicion del hogar.csv", sep = ";", header = T)

Debido a que la variable P6051 muestra el parentesco de los integrantes de la familia con el jefe de hogar solo será utilizada para la creación de la variable número de hijos, es decir, no se tiene en cuenta como covariable para el ajuste de modelos:

#Selección de las variables necesarias
aux_creacion_respuesta<-Caracteristicas_hogar_personas[,c("ï..DIRECTORIO","SECUENCIA_P","P6051")]

Para obtener el número de hijos por hogar se filtra las filas si tienen una relacion de hijo/hija o nieto/nieta con el jefe de hogar y se cuenta el número de hijos por hogar. Los hogares se describen con el código único de ï..DIRECTORIO, SECUENCIA_P

require(tidyverse)
require(dplyr)

# P6051 = 3 : Hijo/hija/hijastro
# P6051 = 4 : Nieto/nieta

num_hijos <- aux_creacion_respuesta %>%
  filter(P6051 == 3 | P6051 == 4)%>%
  group_by(ï..DIRECTORIO, SECUENCIA_P)%>%
  count(SECUENCIA_P)
ï..DIRECTORIO SECUENCIA_P n
7120001 1 1
7120002 1 7
7120009 1 1
7120010 1 3
7120016 1 2
7120018 1 2

El número de hogares que tiene al menos un hijo 59575.

A continuación se procede a calcular el número de integrantes que pertenecen a cada hogar:

require(dplyr)
num_integrantes <- Caracteristicas_hogar_personas %>%
  group_by(ï..DIRECTORIO, SECUENCIA_P) %>%
  count(SECUENCIA_P)
ï..DIRECTORIO SECUENCIA_P n
7120001 1 4
7120002 1 10
7120005 1 2
7120006 1 3
7120007 1 3
7120008 1 1

El número de hogares es 93993.

Finalmente, con la función merge se obtiene el número de hijos en cada hogar uniendo las bases de datos num_integrantes y num_hijos como sigue:

num_hijos_final <- merge(num_integrantes, num_hijos, by =c("ï..DIRECTORIO","SECUENCIA_P"), all.x=TRUE)

num_hijos_final$n.y[is.na(num_hijos_final$n.y)] <- 0
colnames(num_hijos_final) <- c("ï..DIRECTORIO","SECUENCIA_P", "Num Integrantes", "Num Hijos")
ï..DIRECTORIO SECUENCIA_P Num Integrantes Num Hijos
7120001 1 4 1
7120002 1 10 7
7120005 1 2 0
7120006 1 3 0
7120007 1 3 0
7120008 1 1 0
7120009 1 2 1
7120010 1 5 3
7120013 1 4 0
7120016 1 3 2

Selección de variables

Como paso siguiente se realizó de manera exhaustiva en cada una de las bases de la ECV, una preselección de covariables que a criterio de los investigadores, podrían tener alguna relación con la variable respuesta. Con la información anterior se procede a construir la base de datos para el paso siguiente.

A continuación se muestra la base que se obtuvo con las variables preseleccionadas que aparecen listadas en la contextualización de los datos:

# Características del hogar

Caracteristicas_hogar_personas <- read.table("Caracteristicas y composicion del hogar.csv", sep = ";", header = T)
Caracteristicas_hogar_personas<-Caracteristicas_hogar_personas[,c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","P6020", "P6040","P6051", "P5502", "P756","P6081", "P6087","P6083","P6088","P6080")]

# Condiciones de vida del hogar y tenencia de bienes (programas)

condiciones_de_vida <- read.table("Condiciones de vida del hogar y tenencia de bienes (programas).csv", sep=";", header = T)
condiciones_de_vida <- condiciones_de_vida[, c("ï..DIRECTORIO","SECUENCIA_ENCUESTA","ORDEN","P784S4A3")]

# Datos de la vivienda

Datos_vivienda <- read.table("Datos de la vivienda.csv", sep = ";", header = T)
Datos_vivienda<-Datos_vivienda[,c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","CANT_HOGARES_VIVIENDA","P1070","P4015","P8520S1","P8520S1A1","P8520S5","P8520S3", "P8520S4A1")]

# Educación

Educacion<- read.table("Educacion.csv", sep = ";", header = T)
Educacion<-Educacion[,c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","P8587","P8586")]

# Fuerza de trabajo 

fuerza_trabajo <- read.table("Fuerza de trabajo.csv", sep=";", header = T)
fuerza_trabajo <- fuerza_trabajo[, c("ï..DIRECTORIO","SECUENCIA_P","ORDEN", "P6435")]

# Salud

Salud<- read.table("Salud.csv", sep = ";", header = T)
Salud<-Salud[,c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","P6090","P6127")]

# Servicios del hogar

ServiciosDelHogar<- read.table("Servicios del hogar.csv", sep = ";", dec=",", header = T)
ServiciosDelHogar<-ServiciosDelHogar[,c("ï..DIRECTORIO","SECUENCIA_ENCUESTA","ORDEN","P5000","P5666","P5305", "I_HOGAR")]

# Tecnología e información y comunicación

tecn_inf_comunicacion <- read.table("Tecnologías de información y comunicación.csv", sep=";", header = T) 
tecn_inf_comunicacion <- tecn_inf_comunicacion[, c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","P769")]

# Tenencia y financiación de la vivienda que ocupa el hogar

financiacion_vivienda <- read.table("Tenencia y financiación de la vivienda que ocupa el hogar.csv", sep=";", header = T)
financiacion_vivienda <- financiacion_vivienda[,c("ï..DIRECTORIO","SECUENCIA_ENCUESTA","ORDEN","P5095")]

# Uso de energéticos del hogar

energeticos_hogar <- read.table("Uso de energéticos del hogar.csv", sep=";", header = T)
energeticos_hogar <- energeticos_hogar[,c("ï..DIRECTORIO","SECUENCIA_ENCUESTA","ORDEN", "P5018", "P5018S1")]

Unión de las bases de datos:

Se creó una única base de datos con la variable de interés (Número de hijos) y las demás variables seleccionadas. Dado que las posibles variables explicativas provenían de diferentes tablas, se procedió a realizar un merge entre ellas, usando como variable de referencia la columna “Directorio” y “Secuencia” que son las dos variables que identifican a un hogar, y teniendo especial cuidado en la unión de tablas donde las preguntas pueden ser por vivienda, hogar o integrantes y se debía llevar a una misma estructura de hogares.

# Merge de la base de datos de caracteristicas del hogar con condiciones de vida

Base1 <- merge(Caracteristicas_hogar_personas, condiciones_de_vida, by.x = c("ï..DIRECTORIO","SECUENCIA_P"), by.y = c("ï..DIRECTORIO","SECUENCIA_ENCUESTA"), all.x =TRUE)

# Merge de Base1 con datos vivienda

Base2 <- merge(Base1, Datos_vivienda, by="ï..DIRECTORIO", all.x=T)

# Merge de Base2 con educación

Base3 <- merge(Base2, Educacion, by =c("ï..DIRECTORIO","SECUENCIA_P", "ORDEN"), all.x=TRUE)

# Merge de todas las bases de datos restantes

## Bases de personas

Base4 <- Reduce(function(...) merge (..., by=c("ï..DIRECTORIO","SECUENCIA_P", "ORDEN"), all=T), list(Base3, fuerza_trabajo, Salud, tecn_inf_comunicacion))
Base4[,c("ORDEN")] <- NULL

## Bases de hogares

Base5 <- Reduce(function(...) merge (..., by= c("ï..DIRECTORIO","SECUENCIA_ENCUESTA", "ORDEN"), all=T), list(ServiciosDelHogar, financiacion_vivienda, energeticos_hogar))
Base5[,c("ORDEN")] <- NULL

Una vez obtenida la base 4 agrupada por i..DIRECTORIO y SECUENCIA_P y la base 5 agrupada por i..DIRECTORIO y SECUENCIA_ENCUESTA se procede a agruparlas igualando SECUENCIA_P con SECUENCIA_ENCUESTA.

Base6 <- merge(Base4, Base5, by.x =c("ï..DIRECTORIO","SECUENCIA_P"),
               by.y =c("ï..DIRECTORIO","SECUENCIA_ENCUESTA"), all=TRUE)

Finalmente, se agrupa la base anterior con la base que contiene el número de hijos, obteniendo:

# Base final

Base_final <- merge(Base6, num_hijos_final, by =c("ï..DIRECTORIO","SECUENCIA_P"), all.x=TRUE)
Base_final[,c("P6435","P6051","P5018S1","ï..DIRECTORIO","SECUENCIA_P")] <- NULL
P6020 P6040 P5502 P756 P6081 P6087 P6083 P6088 P6080 P784S4A3 CANT_HOGARES_VIVIENDA P1070 P4015 P8520S1 P8520S1A1 P8520S5 P8520S3 P8520S4A1 P8587 P8586 P6090 P6127 P769 P5000 P5666 P5305 I_HOGAR P5095 P5018 P5018S Num Integrantes Num Hijos
2 44 2 1 2 10 3 1 6 0 1 2 4 1 3 1 1 3 7 2 1 3 1 3 1 2 3800000.0 3 85000 85000 4 1
1 61 6 1 3 2 3 2 5 0 1 1 4 1 2 1 1 3 5 2 1 2 1 5 1 1 3656652.8 4 62000 62000 10 7
1 79 6 2 3 10 3 10 6 0 1 1 4 1 3 1 1 3 11 2 1 4 2 5 1 1 4200000.0 1 189000 189000 2 0
2 37 5 2 3 2 2 3 6 0 1 2 4 1 3 1 1 3 9 2 1 2 2 3 1 2 1365000.0 3 188800 188800 3 0
1 72 5 1 3 3 3 2 5 0 1 2 4 1 2 1 1 3 4 2 1 3 NA 4 1 2 765833.3 1 87000 87000 3 0
1 73 5 2 3 9 3 9 6 0 1 2 6 1 2 1 1 3 3 2 1 2 1 3 2 2 1785721.9 3 30000 30000 1 0

Medidas de localización y escala

Se realizó un análisis descriptivo a cada variable donde se identificó el rango y media de las variables continuas y discretas respectivamente, y la proporción de cada clase en las variables categóricas, además de la identificación de las variables con valores faltantes.

require(knitr)
kable(summary(Base_final))%>%
  kable_styling("striped")%>%
  scroll_box(width = "100%", height = "300px")
P6020 P6040 P5502 P756 P6081 P6087 P6083 P6088 P6080 P784S4A3 CANT_HOGARES_VIVIENDA P1070 P4015 P8520S1 P8520S1A1 P8520S5 P8520S3 P8520S4A1 P8587 P8586 P6090 P6127 P769 P5000 P5666 P5305 I_HOGAR P5095 P5018 P5018S Num Integrantes Num Hijos
Min. :1.000 Min. : 13.00 Min. :1.000 Min. :1.000 Min. :1.000 Min. : 1.000 Min. :1.000 Min. : 1.000 Min. :1.000 Min. :0.00000 Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000 Min. :0.000 Min. :1.000 Min. :1.0 Min. :1.00 Min. : 1.00 Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000 Min. : 1.000 Min. :1.000 Min. :1.000 Min. : 0 Min. :1.00 Min. : 0 Min. : 333.3 Min. : 1.000 Min. : 0.000
1st Qu.:1.000 1st Qu.: 36.00 1st Qu.:2.000 1st Qu.:1.000 1st Qu.:2.000 1st Qu.: 1.000 1st Qu.:2.000 1st Qu.: 1.000 1st Qu.:6.000 1st Qu.:0.00000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:4.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.0 1st Qu.:2.00 1st Qu.: 3.00 1st Qu.:2.000 1st Qu.:1.000 1st Qu.:2.000 1st Qu.:1.000 1st Qu.: 2.000 1st Qu.:1.000 1st Qu.:2.000 1st Qu.: 530000 1st Qu.:1.00 1st Qu.: 15000 1st Qu.: 20000.0 1st Qu.: 2.000 1st Qu.: 0.000
Median :1.000 Median : 48.00 Median :4.000 Median :1.000 Median :3.000 Median : 4.000 Median :2.000 Median : 3.000 Median :6.000 Median :0.00000 Median :1.000 Median :1.000 Median :6.000 Median :1.000 Median :1.000 Median :1.000 Median :1.0 Median :3.00 Median : 4.00 Median :2.000 Median :1.000 Median :2.000 Median :1.000 Median : 3.000 Median :2.000 Median :2.000 Median : 1020000 Median :3.00 Median : 30000 Median : 35000.0 Median : 3.000 Median : 1.000
Mean :1.363 Mean : 48.86 Mean :3.716 Mean :1.468 Mean :2.495 Mean : 5.284 Mean :2.362 Mean : 4.921 Mean :5.418 Mean :0.01813 Mean :1.022 Mean :1.308 Mean :5.166 Mean :1.055 Mean :1.901 Mean :1.287 Mean :1.5 Mean :2.47 Mean : 4.44 Mean :1.975 Mean :1.079 Mean :2.186 Mean :1.257 Mean : 3.084 Mean :1.608 Mean :1.903 Mean : 1727919 Mean :2.48 Mean : 46910 Mean : 51487.1 Mean : 3.081 Mean : 1.302
3rd Qu.:2.000 3rd Qu.: 61.00 3rd Qu.:5.000 3rd Qu.:2.000 3rd Qu.:3.000 3rd Qu.: 9.000 3rd Qu.:3.000 3rd Qu.: 9.000 3rd Qu.:6.000 3rd Qu.:0.00000 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:6.000 3rd Qu.:1.000 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:2.0 3rd Qu.:3.00 3rd Qu.: 5.00 3rd Qu.:2.000 3rd Qu.:1.000 3rd Qu.:2.000 3rd Qu.:1.000 3rd Qu.: 4.000 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.: 1873116 3rd Qu.:4.00 3rd Qu.: 57000 3rd Qu.: 60000.0 3rd Qu.: 4.000 3rd Qu.: 2.000
Max. :2.000 Max. :106.00 Max. :6.000 Max. :3.000 Max. :3.000 Max. :10.000 Max. :3.000 Max. :10.000 Max. :6.000 Max. :9.00000 Max. :5.000 Max. :5.000 Max. :7.000 Max. :2.000 Max. :9.000 Max. :2.000 Max. :2.0 Max. :9.00 Max. :13.00 Max. :2.000 Max. :9.000 Max. :4.000 Max. :4.000 Max. :16.000 Max. :2.000 Max. :2.000 Max. :284600000 Max. :6.00 Max. :1000000 Max. :1000000.0 Max. :19.000 Max. :14.000
NA NA NA NA NA NA’s :674 NA NA’s :2181 NA NA NA NA NA NA NA’s :5194 NA NA NA’s :34262 NA’s :2366 NA NA NA NA’s :9197 NA NA NA NA NA NA’s :5194 NA’s :17719 NA NA

Se decidió remover de la base de datos a aquellas variables cuyos valores faltantes superar un tercio de la cantidad de registros en la base de datos.

Gráficos descriptivos

Con el fin de depurar la base de datos, mediante gráficos se realizó un análisis descriptivo de las variables.

Para finalizar la etapa de preprocesamiento, se crearon gráficos Boxplots del Número de hijos vs las variables categóricas, respectivamente, con el fin de analizar la posible influencia o relación de cada predictora con la respuesta.

sapply(1:32, function(i){
  boxplot(Base_final$Num_hijos~Base_final[, i], xlab = nombres[i])
})

Y para las variables numéricas se utilizan gráficos de puntos vs Num_hijos para analizar la posible influencia o relación de cada predictora con la respuesta.

par(mfrow=c(2,2))
plot(Base_final$Num_hijos~ Base_final$Edad)
plot(Base_final$Num_hijos~ Base_final$Ingresos_hogar)
plot(Base_final$Num_hijos~ Base_final$Ultimo_pago_energia)
plot(Base_final$Num_hijos~ Base_final$Pago_mes_energia)

Variables escogidas a partir de los graficos descriptivos

var_interesantes <- c(
  "Genero",
  "Edad",
  "Num_integrantes",
  "Num_cuartos",
  "Estrato",
  "Tipo_vivienda",
  "Num_Subsidios",
  "Educacion_madre",
  "Estado_civil",
  "Ultimo_pago_energia",
  "Ingresos_hogar",
  "Cant_hogares_vivienda",
  "Num_hijos"
)

Se realiza un subset con las variables interesantes

Genero Edad Num_integrantes Num_cuartos Estrato Tipo_vivienda Num_Subsidios Educacion_madre Estado_civil Ultimo_pago_energia Ingresos_hogar Cant_hogares_vivienda Num_hijos
2 44 4 3 3 2 0 1 2 85000 3800000.0 1 1
1 61 10 5 2 1 0 2 6 62000 3656652.8 1 7
1 79 2 5 3 1 0 10 6 189000 4200000.0 1 0
2 37 3 3 3 2 0 3 5 188800 1365000.0 1 0
1 72 3 4 2 2 0 2 5 87000 765833.3 1 0
1 73 1 3 2 2 0 9 5 30000 1785721.9 1 0

Las variables categóricas de Base_interesante se convierten a factor y se crea un modelo de regresión lineal múltiple para poder utilizar regresión paso a paso

Regresión por paso a paso

mod1 <- lm(Num_hijos~., data = Base_interesante)

Para la preseleccion de variables también se utilizaron métodos de selección de variables tales como Regresión paso a paso y Lasso.

require(olsrr)
ols_step_both_p(mod1)
## 
##                                       Stepwise Selection Summary                                       
## ------------------------------------------------------------------------------------------------------
##                                 Added/                   Adj.                                             
## Step         Variable          Removed     R-Square    R-Square       C(p)           AIC         RMSE     
## ------------------------------------------------------------------------------------------------------
##    1      Num_integrantes      addition       0.836       0.836    14121.0890    147987.0388    0.5567    
##    2        Num_cuartos        addition       0.838       0.838    12584.9020    146651.7229    0.5525    
##    3          Estrato          addition       0.838       0.838    12431.6950    146517.6593    0.5521    
##    4       Tipo_vivienda       addition       0.839       0.839    12302.1070    146404.1379    0.5517    
##    5       Estado_civil        addition       0.839       0.839    12229.5050    146340.5776    0.5515    
##    6          Genero           addition       0.859       0.859        2.3500    131676.5283    0.5171    
##    7    Ultimo_pago_energia    addition       0.859       0.859      -10.3360    131663.8376    0.5170    
## ------------------------------------------------------------------------------------------------------

Selección de las variables de interés con Lasso

Se toma la Base_final que posee 32 variables y se convierten las variables categóricas a factor. Se eliminan las variables con mayor número de NA y se eliminan las filas con NA.

Se crea una matriz de diseño para aplicar Regresión Lasso

x <- model.matrix(Num_hijos ~ ., Base_menos_Nas)[,-1]
y <- Base_menos_Nas$Num_hijos

# Aplicación de la técnica de regularización

require(glmnet)

gridz <- 10^seq(-2,10, length = 100)
lasso.mod <- glmnet(x, y, alpha = 1, lambda = gridz)

Se hace validación cruzada para seleccionar el \(\lambda\) óptimo para aplicar en el modelo

set.seed(23)

# Indices para las filas del conjunto de entrenamiento
train <- sample(1:nrow(x), nrow(x)/2)

# Indices para las filas del conjunto de test
test <- -train
y.test <- y[test]

# Validación cruzada
cv.out <- cv.glmnet(x[train,], y[train], alpha=1)

# Obtención del mejor lambda
bestlam <-cv.out$lambda.min

# Lasso con el lambda óptimo
out <- glmnet(x, y, alpha=1)
lasso.coef <-predict(out, type = "coefficients", s=bestlam)[1:90, ]

A continuación se muestra las variables seleccionadas por medio de los dos métodos anteriores:

Variables Regresion por pasos Lasso
Genero X X
Edad
Estado_civil X X
Lugar_nacimiento X
Vive_hogar_padre
Educacion_padre
Vive_hogar_madre X
Educacion_madre
Etnia X
Num_subsidios X
Cant_hogares_vivienda
Tipo_vivienda X X
Material_pisos X
Energia_electrica
Estrato X
Acueducto
Alcantarillado
Nivel_educativo X
Estudia
Afiliado X
Salud_general
Uso_celular X
Num_cuartos X X
Gas_natural
Telefonia_fija
Ingresos_hogar
Contrato_vivienda X
Ultimo_pago_energia X
Num_integrantes X

Con los anteriores procesos, se obtiene la siguiente base, que se usará en la parte de modelamiento

Genero Edad Num_integrantes Num_cuartos Estrato Tipo_vivienda Num_Subsidios Educacion_madre Estado_civil Ultimo_pago_energia Ingresos_hogar Cant_hogares_vivienda Num_hijos Uso_celular Vive_hogar_madre Contrato_vivienda Etnia Afiliado Lugar_nacimiento Nivel_educativo
2 44 4 3 3 2 0 1 2 85000 3800000.0 1 1 1 3 3 6 1 1 7
1 61 10 5 2 1 0 2 6 62000 3656652.8 1 7 1 3 4 5 1 1 5
1 79 2 5 3 1 0 10 6 189000 4200000.0 1 0 2 3 1 6 1 2 11
2 37 3 3 3 2 0 3 5 188800 1365000.0 1 0 2 2 3 6 1 2 9
1 72 3 4 2 2 0 2 5 87000 765833.3 1 0 NA 3 1 5 1 1 4
1 73 1 3 2 2 0 9 5 30000 1785721.9 1 0 1 3 3 6 1 2 3

Modelamiento

Los modelos escogidos son de regresión y clasificación, en cada uno se adaptó la variable respuesta, en los de clasificación se obtienen las predicciones como el número de hijos puntual, en las de regresión se obtienen aproximaciones decimales las cual previamente debían de ser redondeadas para ser comparadas con los valores reales, en general por este último procedimiento se podía notar que en general funcionaba mucho mejor los modelos de clasificación (su tasa de aciertos era la más alta) por lo tanto finalmente estos fueron considerados como los favoritos y continuaron en el proceso de selección de modelos, además cabe aclarar que cada modelo le fue ingresado las variables como se debía según su proceso de ajuste, por ejemplo en el modelo de Knn las variables explicativas fueron ingresadas estandarizadas las que son numéricas y se crearon variables dummy para las categóricas, en general el desempeño de este modelo fue muy bueno, pero su tiempo de ejecución fue superior a otros modelos y este fue uno de los criterios utilizados en la selección de modelos.

Para la selección de modelos a ajustar se tuvo en cuenta que dado que la mayoría de las variables escogidas como significativas corresponden a variables categóricas se debieron escoger modelos que permitieran el correcto manejo de las mismas.

A continuación se utilizarán diferentes modelos para después escoger aquel que mejor se ajuste a las necesidades. Se crea un nuevo dataframe con Num_hijos organizada

barplot(prop.table(table(Base_modelar$Num_hijos)),
        main = "Proporción del número de hijos",
        xlab = "Número de hijos",
        col = "cyan4")
grid()

Se observa que la mayoría de familias tienen entre 0 y 2 hijos, sin embargo, hay una proporción considerable de hogares que poseen 3, 4 y 5 hijos. A partir de los 6 hijos la proporción decae, por lo que se podría pensar en agrupar a los hogares en 5 categorías comprendidas como: 0, 1, 2, 3, 4, 5+.

Base_de_ensayo <- Base_modelar

# Se agrupa los hogares con 5 hijos o más en una sola categoría
Base_de_ensayo$Num_hijos[Base_de_ensayo$Num_hijos >= 5] <- 5
Número de hijos Frecuencia
0 34418
1 23838
2 19896
3 9370
4 3770
5 2701

Bosques Aleatorios para selección de variables

Se organiza la base de datos para aplicar el modelo

library(tidyverse)

# Se omiten las filas que poseen NA
Base_modelar_f <- na.omit(Base_de_ensayo)

# Se convierte la variable Num_hijos a factor
Base_modelar_f$Num_hijos <- as.factor(Base_modelar_f$Num_hijos) 

set.seed(15234) # Semilla

# Se saca una muestra de entrenamiento que conserve las proporciones en la variable Num_hijos
trn_prop <- Base_modelar_f %>%
  mutate(
    var_indx = 1:dim(Base_modelar_f)[1]
  ) %>% 
  group_by(Num_hijos) %>% 
  sample_frac(0.8, replace = F)

# Se saca la muestra de test con las que no fueron seleccionadas en la muestra de train
tst_prop <- Base_modelar_f[-trn_prop$var_indx, ]

# Se elimina la variable de indice
trn_prop$var_indx <- NULL

Con la función ranger aplicamos el modelo de Bosques aleatorios

# Modelo RF
mod_RF <- ranger(
  Num_hijos~., 
  data = (trn_prop), 
  num.trees = 500, 
  mtry = 5, 
  max.depth = 8,
  importance = 'impurity'
)
## Growing trees.. Progress: 90%. Estimated remaining time: 3 seconds.

En la siguiente gráfica se muestra las variables que tienen mayor importancia para Bosques aleatorios:

Utilizamos los pesos de importancia asignados por el Bosque Aleatorio para escoger las variables que se utilizarán en el resto de modelos, además se tiene en cuenta la cantidad de NA en cada una de las variables.

colSums(is.na(Base_de_ensayo))
##                Genero                  Edad       Num_integrantes 
##                     0                     0                     0 
##           Num_cuartos               Estrato         Tipo_vivienda 
##                     0                  5194                     0 
##         Num_Subsidios       Educacion_madre          Estado_civil 
##                     0                  2181                     0 
##   Ultimo_pago_energia        Ingresos_hogar Cant_hogares_vivienda 
##                  5194                     0                     0 
##             Num_hijos           Uso_celular      Vive_hogar_madre 
##                     0                  9197                     0 
##     Contrato_vivienda                 Etnia              Afiliado 
##                     0                     0                     0 
##      Lugar_nacimiento       Nivel_educativo 
##                     0                  2366

Aunque Ingresos_hogar y Nivel_educativo en primera instancia tienen una importancia elevada para el modelo se decide eliminar Nivel_educativo ya que posee datos faltantes, adicionalmente se elimina Ingresoso_hogar ya que, a criterio de los investigadores, esta variable puede generar controversia a la hora de ser contestada.

Variables escogidas

library(tidyverse)

# Variables en orden de importancia según RF
var_imprt <-  c(
    "Num_integrantes",
    "Estado_civil",
    "Genero",
    "Edad",
    "Vive_hogar_madre",
    "Num_hijos"
  )

# Se convierte la variable Num_hijos a factor
Base_modelar_f <- Base_de_ensayo[,var_imprt]
Base_modelar_f$Num_hijos <- as.factor(Base_modelar_f$Num_hijos) 

set.seed(15234) # Semilla

# Se saca una muestra de entrenamiento que conserve las proporciones en la variable Num_hijos
trn_prop <- Base_modelar_f %>%
  mutate(
    var_indx = 1:dim(Base_modelar_f)[1]
  ) %>% 
  group_by(Num_hijos) %>% 
  sample_frac(0.8, replace = F)

# Se saca la muestra de test con las que no fueron seleccionadas en la muestra de train
tst_prop <- Base_modelar_f[-trn_prop$var_indx, ]

# Se elimina la variable de indice
trn_prop$var_indx <- NULL

Modelo de Regresión Lineal Múltiple

Se debe convertir la variable respuesta nuevamente a numérica para poder aplicar regresión lineal.

modelo1 <- lm(as.numeric(as.character(Num_hijos))~., data=trn_prop)

El error del modelo es 0.5346394

Análisis de residuales.

Se puede apreciar que no se cumplen los supuestos en los residuales.

Matriz de confusión

-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 122 5948 646 127 32 7 1 0 0 0 0 1 0 0 0
1 0 122 4143 409 83 7 3 1 0 0 0 0 0 0 0
2 0 0 321 3379 249 19 7 3 0 1 0 0 0 0 0
3 0 0 0 758 1056 50 8 1 0 1 0 0 0 0 0
4 0 0 0 1 578 143 26 4 0 2 0 0 0 0 0
5 0 0 0 0 4 215 200 67 25 21 4 0 1 2 1

La tasa de acierto es 0.1125592, la tasa de error es 0.8874408

Árbol de clasificación

Con la función rpart se ajusta el modelo y se analizan los resultados

mod1_arboles <- rpart(Num_hijos~., data = trn_prop)

Se hacen las predicciones y se obtiene la siguiente matriz de confusión

0 1 2 3 4 5
0 6188 410 176 91 13 6
1 333 3795 483 122 28 7
2 0 148 3287 444 73 27
3 0 0 60 1583 182 49
4 0 0 0 163 458 133
5 0 0 0 0 54 486

La tasa de acierto es 0.8403107, la tasa de error es 0.1596893

Árboles de Regresión

mod1_reg_arboles <- rpart(as.numeric(as.character(Num_hijos))~., data = trn_prop)

Se hacen las predicciones y se obtiene la matriz de confusión

0 1 2 3 4
0 6407 285 140 33 19
1 1425 2756 483 69 35
2 0 317 3264 298 100
3 0 0 455 1188 231
4 0 0 0 163 591
5 0 0 0 0 540

La tasa de acierto es 0.7556785, la tasa de error es 0.2443215

Regresión Poisson

HijosPoisson <-gamlss(as.numeric(as.character(Num_hijos))~., data= trn_prop, family=PO(mu.link="log"))
## GAMLSS-RS iteration 1: Global Deviance = 170257.6 
## GAMLSS-RS iteration 2: Global Deviance = 170257.6

Se hacen las predicciones y obtenemos la matriz de confusión

-2 -1 0 1 2 3 4 5
0 62 4464 2326 30 1 0 1 0
1 0 365 4272 126 5 0 0 0
2 0 27 3270 670 11 1 0 0
3 0 1 333 1525 13 2 0 0
4 0 0 19 696 36 3 0 0
5 0 0 0 221 268 43 4 4
acierto<-sum(diag(MC))/sum(MC)
error <- 1-acierto

La tasa de acierto es 0.2819831, la tasa de error es 0.7180169

Bosque Aleatorio

mod_RF <- ranger(
  Num_hijos~., 
  data = (trn_prop), 
  num.trees = 500, 
  mtry = 5, 
  max.depth = 8,
  importance = 'impurity'
)

Se hacen las predicciones y se obtiene la matriz de confusión

0 1 2 3 4 5
0 6254 207 9 0 0 0
1 426 3996 145 1 0 0
2 127 428 3336 77 1 1
3 58 90 385 1512 42 1
4 13 35 72 223 539 9
5 6 12 32 61 172 529

La tasa de acierto es 0.8599394, la tasa de error es 0.1400606

Naive Bayes

mod_Naive_Bayes <- naiveBayes(Num_hijos ~ ., data = trn_prop)

Se hacen las predicciones y se obtiene la matriz de confusión

0 1 2 3 4 5
0 5909 830 96 38 9 2
1 1342 3003 319 80 18 6
2 35 999 2547 332 52 14
3 0 29 426 1258 143 18
4 0 0 0 364 335 55
5 0 0 0 10 193 337

La tasa de acierto es 0.7122187, la tasa de error es 0.2877813

Knn

Conversion de las variables categoricas a variables dummy

library(dummies)

# Conjunto de entrenamiento
Base_KNN_dummy_trn <- dummy.data.frame(data=data.frame(trn_prop[ ,-6]))
Base_KNN_dummy_trn <- cbind(Base_KNN_dummy_trn,"Num_hijos" = trn_prop$Num_hijos)

# Conjunto de prueba
Base_KNN_dummy_tst <- dummy.data.frame(data=tst_prop[ ,-6])
Base_KNN_dummy_tst <- cbind(Base_KNN_dummy_tst,"Num_hijos" = tst_prop$Num_hijos)

Se normalizan las Variables Numéricas

#Conjunto de entrenamiento
datos_c_trn <- Base_KNN_dummy_trn
datos_c_trn[,c(1,10)] <- scale(datos_c_trn[,c(1,10)])

#Conjunto de prueba
datos_c_tst <- Base_KNN_dummy_tst
datos_c_tst[,c(1,10)] <- scale(datos_c_tst[,c(1,10)])

Conjuntos de entrenamiento y test

train <- datos_c_trn[ ,-14] # crea train sin la variable respuesta
test <- datos_c_tst[ ,-14] # crea test sin la variable respuesta

y_train <- datos_c_trn[ ,14]
y_test <- datos_c_tst[ ,14]

Ajuste modelo Knn

Se entrena el modelo knn para que escoja el número k óptimo siendo el valor máximo k=30.

modelo <- train.kknn(Num_hijos ~ ., data = datos_c_trn, kmax = 30)
modelo
pred_knn <- predict(modelo, datos_c_tst)

Con el k óptimo se realiza el modelo se hacen las predicciones y se obtiene la matriz de confusión

knn_model <- knn(train, test, cl = y_train, k = 18)
summary(knn_model)
##    0    1    2    3    4    5 
## 6536 4579 3987 2097  890  710
0 1 2 3 4 5
0 6285 221 21 7 2 0
1 442 3984 152 1 0 0
2 107 434 3346 97 3 0
3 40 91 369 1517 78 2
4 7 30 68 207 535 43
5 3 8 23 45 136 495

La tasa de acierto es 0.8597266, la tasa de error es 0.1402734.

Resultados

Selección del mejor modelo

Para comparar la eficiencia de los modelos se crea una matriz en la cual se almacenará las tasas de acierto de los modelos que se construyeron en el paso anterior

df <- matrix(rep(NA,80), nrow=20, ncol=4)
df <- data.frame(df)
colnames(df) <- c("Arbol_clasificacion","RandomForest", "NaiveBayes", "Knn")

Para llenar la matriz anterior se realizó un for que ejecuta cada uno de los modelos 20 veces, escogiendo aleatoriamente el conjunto de entrenamiento y el conjunto de prueba

for(i in 1:20){

  set.seed(i) # Semilla
  
  # Se saca una muestra de entrenamiento que conserve las proporciones en la varaible Num_hijos
  
  trn_prop <- Base_modelar_f %>%
    mutate(
      var_indx = 1:dim(Base_modelar_f)[1]
    ) %>% 
    group_by(Num_hijos) %>% 
    sample_frac(0.8, replace = F)
  
  # Se saca la muestra de test con las que no fueron seleccionadas en la muestra de
  # train
  tst_prop <- Base_modelar_f[-trn_prop$var_indx, ]
  
  # Se elimina la variable de índice
  trn_prop$var_indx <- NULL
  
  trn_prop <- trn_prop[sample(1:dim(trn_prop)[1]), ]
  tst_prop <- tst_prop[sample(1:dim(tst_prop)[1]), ]
  
    # Ajuste de los modelos
  
  ## Árbol de clasificación 
  arbol_clasificacion <- rpart(Num_hijos~., data = trn_prop)
  pred_arbol_clasificacion <-  predict(arbol_clasificacion, newdata = tst_prop, type=
                                         "class")
  
  tasa_arbol_clasificacion <- matriz_confusion(pred_arbol_clasificacion,
                                               tst_prop$Num_hijos)
  
  # Modelo RF
  RF <- ranger(Num_hijos~.,  data = (trn_prop),   num.trees = 100,  mtry = 5, 
               max.depth = 8,  importance = 'impurity')
  
  
  pred_RF <- predict(RF, data = (tst_prop))
  
  tasa_RF <- matriz_confusion(pred_RF$predictions, tst_prop$Num_hijos)
  
  ## Naive Bayes
  
  Naive_Bayes <- naiveBayes(Num_hijos ~ ., data = trn_prop)
  pred_Naive_Bayes <- predict(Naive_Bayes, newdata = tst_prop, type="class")
  
  tasa_Naive_Bayes <- matriz_confusion(pred_Naive_Bayes, tst_prop$Num_hijos)
  
  
  ## Knn
  
  # Conjunto de entrenamiento
  Base_KNN_dummy_trn <- dummy.data.frame(data=data.frame(trn_prop[ ,-6]))
  Base_KNN_dummy_trn <- cbind(Base_KNN_dummy_trn,"Num_hijos" = trn_prop$Num_hijos)
  # Conjunto de prueba
  Base_KNN_dummy_tst <- dummy.data.frame(data=tst_prop[ ,-6])
  Base_KNN_dummy_tst <- cbind(Base_KNN_dummy_tst,"Num_hijos" = tst_prop$Num_hijos)
  
  #Conjunto de entrenamiento
  datos_c_trn <- Base_KNN_dummy_trn
  datos_c_trn[,c(1,10)] <- scale(datos_c_trn[,c(1,10)])
  
  #Conjunto de prueba
  datos_c_tst <- Base_KNN_dummy_tst
  datos_c_tst[,c(1,10)] <- scale(datos_c_tst[,c(1,10)])
  
  # Separación de la variable respuesta
  train <- datos_c_trn[ ,-14] # crea train sin la variable respuesta
  test <- datos_c_tst[ ,-14] # crea test sin la variable respuesta
  y_train <- datos_c_trn[ ,14]
  y_test <- datos_c_tst[ ,14]
  pred_knn <- knn(train, test, cl = y_train, k = 20)
  
  tasa_knn <- matriz_confusion(pred_knn, y_test)
  
  print(paste("Tasa acierto Knn:", tasa_knn))
  
  tasas <- c(tasa_arbol_clasificacion, tasa_RF, tasa_Naive_Bayes, tasa_knn)
  
  df[i,] <- tasas
  
}
Arbol_clasificacion RandomForest NaiveBayes Knn
1 0.84280 0.86150 0.715600 0.861000
2 0.84260 0.86240 0.717300 0.860900
3 0.83990 0.85970 0.719800 0.856900
4 0.83690 0.85800 0.708100 0.858200
5 0.84250 0.86500 0.713500 0.864400
6 0.84180 0.86360 0.721000 0.860600
7 0.84110 0.86040 0.717700 0.858600
8 0.84170 0.86240 0.709900 0.858700
9 0.84210 0.86350 0.713700 0.861900
10 0.83940 0.86310 0.715300 0.861100
11 0.84730 0.86760 0.717200 0.863900
12 0.84220 0.86220 0.722300 0.860700
13 0.84320 0.86410 0.721600 0.862600
14 0.84350 0.86670 0.709800 0.867500
15 0.83990 0.86030 0.713800 0.857200
16 0.83970 0.86330 0.708600 0.860800
17 0.83980 0.86160 0.712200 0.858500
18 0.84220 0.86060 0.715300 0.859200
19 0.84140 0.86140 0.710000 0.860500
20 0.84160 0.86040 0.708800 0.860700
Media 0.84158 0.86239 0.714575 0.860695

El modelo final se escogió ya que no solo presenta una de las tasas de acierto más altas entre todos los modelos desarrollados, sino que a su vez nos permitió reducir la dimensionalidad del conjunto de datos, ya que este valoraba y utilizaba 5 variables principalmente para la modelación y predicción, además de que estas variables no contaban con valores faltantes permitiéndonos contar con el conjunto de datos completo que es una cantidad muy apreciable de registros.

Como último filtro, se busca reducir el número de árboles que se utilizó en el proceso anterior. Para esto se hace una prueba cambiando el tamaño del bosque a 100 árboles en lugar de 500

RF <- ranger(Num_hijos~.,  data = (trn_prop),   num.trees = 100,  mtry = 5, 
             max.depth = 8,  importance = 'impurity')
pred_RF <- predict(RF, data = (tst_prop))
tasa_RF <- matriz_confusion(pred_RF$predictions, tst_prop$Num_hijos)

La tasa de acierto tanto con 100 y 500 árboles es de aproximadamente 0.86, es decir, el tamaño del bosque no representa un cambio significativo a la hora de predecir, por lo que se decide implementar el modelo con 100 árboles.

Ajuste del modelo final con todas las observaciones

RandomForest <- ranger(Num_hijos~.,  data = Base_modelo,   num.trees = 100,  mtry = 5, 
             max.depth = 8,  importance = 'impurity')

Prueba de Escritorio

A continuación se darán los datos que corresponden a la información de cada uno de los investigadores

require(ranger)
Miguel <- c(3, 6, 1, 52, 2)
Jennifer <- c(4, 2, 2, 43, 3)
Juan <- c(4, 6, 1, 59, 2)
Cristina <- c(3, 2, 2, 50, 2)
Salome <- c(3, 4, 2, 53, 3)


df <- rbind(Miguel, Jennifer, Juan, Cristina, Salome)
df <- data.frame(df)
colnames(df) <- c("Num_integrantes",  
                  "Estado_civil", 
                  "Genero", 
                  "Edad",
                  "Vive_hogar_madre")

real <- factor(c(1,2,2,1,2),levels = c("0","1","2","3","4","5"))
prediccion <- predict(RandomForest, df)
prediccion$predictions
## [1] 1 2 2 1 2
## Levels: 0 1 2 3 4 5
Inverstigador Valores_predichos Valores_Reales
Miguel 1 1
Jennifer 2 2
Juan 2 2
Cristina 1 1
Salome 2 2

Conclusiones

Bibliografía